package Core::Attribute;

use strict;
use warnings;
use vars qw{ @ISA @EXPORT };
use Exporter;
use Core::Meta;
use Core::List;

@ISA = qw( Core::Meta );
@EXPORT = qw (  
	Attribute
);

sub Attribute
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
    my $rhAttribute = Core::Attribute->new( @_ );
    return $rhAttribute;
}

sub new
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhClass ) = shift;               # Object    
    my( $rhSelf ) = {};
    bless( $rhSelf, $rhClass);
    
	my( $sName ) = shift; 
    return 0 if not $sName;
	
	$rhSelf->setName( $sName );
	$rhSelf->{ VALUES } = List( @_ );
	$rhSelf->selected();
    
	return $rhSelf;
}

sub initValues
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	if( $rhSelf->{ VALUES } ){
		my $rhList = $rhSelf->{ VALUES };
		$rhList->init();
	}
	else{
		$rhSelf->{ VALUES } = List();
	}	
	return 1;
}


sub addValue
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 	
	my $rhList = $rhSelf->{ VALUES };
	$rhList->add( @_ );
}

sub setValuesObj
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my( $rhList ) = shift;

	return 0 if not $rhList;
	$rhSelf->{ VALUES } = $rhList;
}
	
sub getValuesObj
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	return $rhSelf->{ VALUES } ;
}

sub setValues
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $raValues = shift;
	return 0 if not $raValues or
				not @{ $raValues };
				
	my $rhList = $rhSelf->{ VALUES };			
	$rhList->setList( $raValues );
}	

sub getValues
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $rhList = $rhSelf->{ VALUES };		
	return $rhList->getList();
}

sub setValue
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift;
	my( $sValue ) = pop;
	
	return 0 if not defined $sValue;
	my $sIndex = $_[ 0 ] || 0;
	my $rhList = $rhSelf->{ VALUES };		
	$rhList->set( $sIndex , $sValue  );
}

sub getValue
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $sIndex = $_[ 0 ] || 0;
	my $rhList = $rhSelf->{ VALUES };		
	return $rhList->get( $sIndex );
}

sub firstValue
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $rhList = $rhSelf->{ VALUES };
	return $rhList->first();	
}	

sub lastValue
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $rhList = $rhSelf->{ VALUES };
	return $rhList->last();	
}	

sub popValue
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $rhList = $rhSelf->{ VALUES };
	return $rhList->pop();	
}	

sub delValue
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $sIndex = shift;
	return 0 if not defined $sIndex;
	
	my $rhList = $rhSelf->{ VALUES };
	return $rhList->del( $sIndex );	
}


sub iterator
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $rhList = $rhSelf->{ VALUES };	
	$rhList->iterator();
}

sub compareValues
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift;
	my ( $raValues ) = shift;
	
	return 0 if not $raValues or
				not @{ $raValues };
	
	my $rhList = $rhSelf->{ VALUES };	
	return 0 if $#{ $raValues }	+ 1 != $rhList->size();
	
	foreach ( 0 .. $#{ $raValues } ){
		if( $rhList->getValue( $_ ) != $raValues->[ $_ ]  ){
			return 0;
		}
	}	
	
	return 1;
}	

sub equals
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my ( $rhSelf ) = shift; 
	my ( $rhAttribute, $sUseType ) = @_;

	return 0 if not $rhAttribute or 
				not ref( $rhAttribute );
				
	my $sName = $rhAttribute->getName();
	return 0 if not $rhAttribute->isSameName( $sName );
	
	return $rhSelf->compareValues( $rhAttribute->getValues() );		
}	

sub size
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $rhList = $rhSelf->{ VALUES };	
	$rhList->size();
}	

sub toList
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift; 
	my $rhList = $rhSelf->{ VALUES };		
	return $rhList->toList();
}

sub toString
#*****************************************************************************
# PURPOSE:
# USAGE: 
# PASSED ARGS:
# RETURN ARGS:
# $sError - Fail Error Message
#*****************************************************************************
{
	my( $rhSelf ) = shift;
	my $sValue = $rhSelf->SUPER::toString();
	
	my $rhList = $rhSelf->{ VALUES };
	$sValue	.= $rhList->toString();
	return $sValue;
}	